#!/usr/bin/env python
# coding:utf-8
from PoboAPI import *
import datetime
import numpy as np
#分钟级别回测
#开始时间，用于初始化一些参数
def OnStart(context) :
    print("I\'m starting...")
    #登录交易账号，需在主页用户管理中设置账号，并把期货测试替换成您的账户名称
    context.myacc = None
    if "回测期货" in context.accounts :
        print("登录交易账号[回测期货]")
        if context.accounts["回测期货"].Login() :
            context.myacc = context.accounts["回测期货"]

def OnMarketQuotationInitialEx(context, exchange,daynight):
    if exchange != 'SHFE':
        return
    #获取主力合约
    g.code = GetMainContract('SHFE', 'rb',20)
    #订阅K线数据，用于驱动OnBar事件
    SubscribeBar(g.code, BarType.Min)

def GetCurrentTradingDateTime(exchange):#返回以交易日而非自然日的日期和时间
    
    exchange="SHFE"
    
    #tradingday=datetime.datetime.strptime(date_str,'%Y-%m-%d')GetCurrentTradingDate(exchange)
    tradingday=GetCurrentTradingDate(exchange)
    
    
    
    currenttime= GetCurrentTime()
    
    
    if tradingday.day==currenttime.day:#如果交易日和自然日天数一致
        
        return currenttime
    
    else: #如果交易日和自然日天数不一致
        
        return currenttime+datetime.timedelta(days=(tradingday.day-currenttime.day))    
    
#实时行情事件，当有新行情出现时调用该事件Ex
def OnBar(context,code,bartype):
    #过滤掉不需要的行情通知
    if code != g.code:
        return
    dyndata = GetQuote(g.code)
    
    option = PBObj()
    #option.buysellflag = '0'
    orders = context.accounts["回测期货"].GetOrders()
    
    if len(orders)>0:#已经有委托
        
        for i in orders: #对已经发出的委托，检查是否已经超过2分钟不成交，不成交就撤单
            
            
            if i.status==5 and GetCurrentTradingDateTime("SHFE")>=i.inserttime+datetime.timedelta(minutes=2):
                
                
                context.accounts["回测期货"].CancelOrder(context.accounts["回测期货"].GetOrder(i.id))
        
                print("下单后2分钟不成交就撤单 委托时间"+str(i.inserttime)) 
                
                
                
                
            
            
        
        
    
    
    
    uid1 = QuickInsertOrder(context.accounts["回测期货"],g.code, 'buy','open', dyndata.now-20,10)
    
    print("uid "+str(uid1))
    
def OnOrderChange(context, AccountName, order) :
    #有委托回报事件再去撤单
    print("OrderChanged on " + str(order.id) + " on " + str(AccountName))
    
    if order.status==5 and order.price % 2 ==0: #对于委托价格为偶数的委托立刻撤单
        #注意在实盘中频繁报撤单会被警告
    
        context.accounts["回测期货"].CancelOrder(context.accounts["回测期货"].GetOrder(order.id))
        
        print("下单后立即执行撤单执行撤单") 
    
    
    
    #计算均线
#     MA = GetIndicator("MA",code,params=(5,10),bar_type = BarType.Day)
#     MA1 = MA["MA(5)"]
#     MA2 = MA["MA(10)"]
#     if len(MA2)<2:
#         return
#     #ma1上穿ma2时买入螺纹主力1手
#     elif MA1[-1] >= MA2[-1] and MA1[-2]<MA2[-2]:
#         QuickInsertOrder(context.myacc,g.code,'buy','open',dyndata.now,10)
#     #ma1下穿ma2时卖出平仓
#     elif MA1[-1] <= MA2[-1] and MA1[-2]>MA2[-2]:
#         QuickInsertOrder(context.myacc,g.code,'sell','close',dyndata.now,10)
        
